Jackson JSON প্রক্রিয়াকরণের সময় কিছু ক্ষেত্রে Exception ঘটতে পারে, যেমন invalid data format, missing required fields, বা unsupported types। এই ধরনের exceptions হ্যান্ডেল করার জন্য আপনি Jackson এর Custom Exception Handling Strategies ব্যবহার করতে পারেন। Jackson এ Custom Exception Handling করতে Jackson-এর কিছু কাস্টম DeserializationException এবং SerializationException হ্যান্ডলিং কৌশল রয়েছে, যা নির্দিষ্ট ভুলগুলির জন্য কাস্টম এক্সপ্লানেশন প্রদান করে।
Jackson Exception Handling Overview
Jackson সাধারণত JSON Serialization এবং Deserialization এর সময় কিছু নির্দিষ্ট exceptions ছুঁড়ে দেয়, যেগুলি ডিফল্টভাবে JsonProcessingException এ ক্যাচ করা হয়। তবে, আপনি এই exceptions কে কাস্টমাইজ করতে পারেন, যাতে আপনার অ্যাপ্লিকেশন আরও পরিস্কারভাবে এবং ইউজার-ফ্রেন্ডলি মেসেজ প্রদান করতে পারে।
Common Jackson Exceptions
JsonMappingException:- যখন JSON ডেটা Java অবজেক্টের সাথে সঠিকভাবে ম্যাপ হতে পারে না (যেমন, অবৈধ ডেটা টাইপ বা মিসিং ফিল্ড)।
JsonParseException:- যখন JSON পার্স করার সময় সিনট্যাক্স ভুল থাকে (যেমন, অবৈধ JSON ফরম্যাট)।
InvalidFormatException:- যখন JSON ডেটার ফরম্যাট Java অবজেক্টের জন্য উপযুক্ত নয় (যেমন, টাইপ কাস্টিং সমস্যা)।
JsonProcessingException:- একটি অভ্যন্তরীণ superclass যা সাধারণভাবে Jackson এ JSON পার্সিং এবং প্রক্রিয়াকরণের সময় অন্য যেকোনো exception ধরে।
Custom Exception Handling Strategies
1. Custom Deserialization Exception Handling
কাস্টম Deserialization exception হ্যান্ডলিং এর জন্য, আপনি @JsonDeserialize অ্যানোটেশন ব্যবহার করতে পারেন এবং Custom Deserializer তৈরি করে বিশেষভাবে invalid data অথবা missing required fields এর জন্য কাস্টম exception বা error মেসেজ তৈরি করতে পারেন।
Custom Deserializer উদাহরণ:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import java.io.IOException;
public class CustomDateDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String date = p.getText();
try {
// Custom logic to parse the date
if (date.length() != 10) { // Invalid date format
throw new InvalidFormatException(p, "Invalid date format, expected YYYY-MM-DD", date, String.class);
}
return date;
} catch (Exception e) {
throw new InvalidFormatException(p, "Invalid date format", date, String.class);
}
}
}
Person ক্লাসে Custom Deserializer প্রয়োগ করা:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
public class Person {
private String name;
@JsonDeserialize(using = CustomDateDeserializer.class)
private String birthDate;
// Constructors, Getters, Setters
}
Error Handling Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomDeserializerExample {
public static void main(String[] args) {
String json = "{\"name\":\"Rahim\",\"birthDate\":\"12-2020-01\"}"; // Invalid date format
try {
ObjectMapper mapper = new ObjectMapper();
Person person = mapper.readValue(json, Person.class);
System.out.println(person.getName());
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}
Output:
Error: Invalid date format, expected YYYY-MM-DD
এই উদাহরণে, যখন invalid date format পাওয়া যায়, তখন InvalidFormatException Exception সহ কাস্টম error মেসেজ পাঠানো হয়।
2. Custom Serialization Exception Handling
Serialization এর সময় যখন কোনো অবজেক্ট JSON এ রূপান্তর করার সময় সমস্যা হয় (যেমন, unsupported type বা invalid field), তখন Custom Serializer ব্যবহার করে কাস্টম exception হ্যান্ডলিং করা যায়।
Custom Serializer উদাহরণ:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import java.io.IOException;
public class CustomPriceSerializer extends JsonSerializer<Double> {
@Override
public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
try {
if (value < 0) {
throw new InvalidFormatException(gen, "Price cannot be negative", value, Double.class);
}
gen.writeNumber(value);
} catch (Exception e) {
throw new InvalidFormatException(gen, "Invalid price format", value, Double.class);
}
}
}
Product ক্লাসে Custom Serializer প্রয়োগ করা:
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
public class Product {
private String name;
@JsonSerialize(using = CustomPriceSerializer.class)
private double price;
// Constructors, Getters, Setters
}
Error Handling Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomSerializerExample {
public static void main(String[] args) {
Product product = new Product("Laptop", -999.99); // Invalid price
try {
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(product);
System.out.println(json);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}
Output:
Error: Invalid price format
এখানে, যদি পণ্যের মূল্য নেতিবাচক (negative) হয়, তবে InvalidFormatException Exception সহ একটি কাস্টম error মেসেজ পাঠানো হয়েছে।
3. Global Exception Handling Strategy in Spring Boot (if using Spring)
Spring Boot-এ Jackson এর কাস্টম exception হ্যান্ডলিংয়ের জন্য একটি গ্লোবাল exception handler ব্যবহার করা যেতে পারে। এখানে Spring Boot এর @ControllerAdvice ব্যবহার করে কাস্টম exception হ্যান্ডলিং করা হয়।
Global Exception Handler Example:
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleAllExceptions(Exception ex) {
return new ResponseEntity<>("Custom Error: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(InvalidFormatException.class)
public ResponseEntity<String> handleInvalidFormatException(InvalidFormatException ex) {
return new ResponseEntity<>("Custom Error: Invalid format - " + ex.getMessage(), HttpStatus.BAD_REQUEST);
}
}
Controller Example:
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
@RestController
public class ProductController {
@GetMapping("/product")
public Product getProduct() {
return new Product("Laptop", -500); // Invalid price will trigger exception
}
}
Summary of Custom Exception Handling Strategies
| Exception Type | Use Case | Solution Approach |
|---|---|---|
| InvalidFormatException | Invalid date format, number format issues | Use JsonDeserializer or JsonSerializer with custom logic. |
| JsonMappingException | Object field mapping issues, mismatched types | Custom Exception in Deserializer/Serializer |
| JsonParseException | Syntax error in JSON data (unexpected tokens, illegal characters) | Handle with JsonParseException and throw customized message |
| Custom Exception Handling | Validation issues like negative price, missing required field | Implement @JsonSerialize, @JsonDeserialize, or use global handler in Spring Boot |
- Custom Exception Handling Jackson এর মাধ্যমে ডেটা প্রক্রিয়া করার সময় সঠিক error মেসেজ তৈরি করতে সহায়তা করে।
- Deserialization এবং Serialization এ কাস্টম Exception হ্যান্ডলিং নিশ্চিত করে যে ডেটা সঠিকভাবে প্রক্রিয়া হবে এবং ইউজার ফ্রেন্ডলি মেসেজ দেওয়া হবে।
- Jackson exception handling কাস্টমাইজেশন আপনাকে ডেটা ভ্যালিডেশন এবং পার্সিং-এর ক্ষেত্রে অধিক নিয়ন্ত্রণ প্রদান করে।
Read more